#ifndef _MIFARE_API_H_
#define _MIFARE_API_H_

#include "rfid_board.h"

#if _RFID_FUNCTION_ENABLE_

// 最大数据总数
#define CARD_MAX_DATA_LENGTH                                (624ul)
// 验证密钥长度
#define CARD_VERIFY_KEY_LENGTH                              (6ul)

/* MIFARE 卡扇区相关定义 */
// 起始扇区
#define MIFARE_START_SECTOR_ID                              (1ul)
// 结束扇区
#define MIFARE_END_SECTORD_ID                               (15ul)

// 扇区总数
#define MIFARE_MAX_NUMVER_OF_SECTORD                        (16ul)
// 一块操作字节数量
#define MIFARE_CARD_BLOCK_DATA_LENGTH                       (16ul)
// 一扇区操作字节数量
#define MIFARE_CARD_SECTOR_DATA_LENGTH                      (48ul)
// 扇区中可支持操作的块数量
#define MIFARE_NUMBER_OF_OPERATION_BLOCK_IN_SECTOR          (3ul)       

/**
 * @brief 验证密钥
 *
 * @param AuthMode  - 验证模式
 *                    0x60 = 验证密钥A
 *                    0x61 = 验证密钥B
 * @param BlockAddr - 块地址
 * @param pKey      - 厂商密钥
 * @param pSnr      - 卡序号
 * @return bool     - 操作状态（true：成功 false：失败）
 */
extern bool MifareAuthentication(uint8_t AuthMode, uint8_t BlockAddr, uint8_t *pKey, uint8_t *pSnr);

/**
 * @brief 写块
 * 
 * @param BlockAddr - 块地址
 * @param pDataIn   - 待写入得数据
 * @param DataSize  - 待写入数据长度
 * @return bool     - 操作状态（true：成功 false：失败）
 */
extern bool MifareBlockWrite(uint8_t BlockAddr, const uint8_t *pDataIn, uint8_t DataSize);

/**
 * @brief 读块
 *
 * @param BlockAddr - 块地址
 * @param pDataOut  - 用于存放读取到的数据，长度为 16Byte
 * @return bool     - 操作状态（true：成功 false：失败）
 */
extern bool MifareBlockRead(uint8_t BlockAddr, uint8_t *pDataOut);

/**
 * @brief 修改扇区访问密钥
 * 
 * @param SectorId   - 扇区编码
 * @param pNewKeyInA - 密钥A
 * @param pNewKeyInB - 密钥B
 * @return bool     - 操作状态（true：成功 false：失败）
 */
extern bool MifareChangeKey(uint8_t SectorId, const uint8_t *pNewKeyInA, const uint8_t *pNewKeyInB);

/**
 * @brief 初始化扇区
 * 
 * @param SectorId 
 * @return bool     - 操作状态（true：成功 false：失败）
 */
extern bool MifareInitializeSector(uint8_t SectorId);

#endif
#endif
